# -*- coding: utf-8 -*-
#
# 模块路由配置文件
# Author: Alex Cai
# Email: cyy0523xc@qq.com
# Created Time: 2025-06-13
from enum import Enum
from typing import List, Dict, Any
from pydantic import BaseModel, Field


class NodeExceptionType(Enum):
    """节点异常的处理方式"""
    Retry = "Retry"         # 重试
    Exit = "Exit"           # 退出
    Continue = "Continue"   # 继续执行
    Raise = "Raise"         # 触发异常并退出


class NodeParamValueType(Enum):
    """参数值的类型"""
    Normal = "Normal"          # 普通值，不需要进行额外处理
    Reference = "Reference"    # 需要对值进行引用处理
    Expression = "Expression"  # 该值是一个Python表达式
    Template = "Template"      # 值是一个字符串模板


class NodeParams(BaseModel):
    """工具函数的输入参数"""
    key: str = Field(..., title="参数变量名", description="同一节点内的参数名必须唯一")
    value: Any = Field(..., title="变量的值")
    type: NodeParamValueType = Field(NodeParamValueType.Normal, title="参数值类型", description="不同类型的值有不同的处理方式")
    xargs: bool = Field(False, title="是否对该变量的值进行循环", description="只对值为列表变量有效")


class Node(BaseModel):
    """工作流节点"""
    key: str = Field(..., title="节点ID", description="节点在工作流中的唯一ID")
    debug: bool = Field(False, title="是否开启测试模式", description="针对当前节点是否开启测试模式")
    tool_name: str = Field(..., title="工具名称", description="该节点调用的工具名称")
    params: NodeParams = Field(..., title="工具函数的输入参数")
    breakpoint: bool = Field(False, title="是否断点", description="当设置为断点时")
    exception: NodeExceptionType = Field(NodeExceptionType.Raise, title="异常处理方式")
    exception_retry_times: int = Field(0, title="重试次数", description="异常水电费试次数")
    goto: List[str] = Field([], title="执行完成之后跳转的目标节点ID列表", description="当前节点完成时, 可以进入多个节点, 值为节点ID的列表")


class FlowRequest(BaseModel):
    """工作流接口请求参数"""
    debug: bool = Field(False, title="是否开启测试模式")
    trace_id: str = Field("", title="跟踪ID", description="用于跟踪请求的唯一标识符，如果为空则自动生成")
    nodes: List[Node] = Field(..., title="节点列表", description="节点配置列表")


class FlowResponse(BaseModel):
    """工作流接口响应参数"""
    output: Dict[str, Any] = Field({}, title='各个节点在处理过程中的数据',
                                   description='每个节点处理过程中产生的数据, key为对应节点ID')
    debug_msg: List = Field([], title='工具处理过程的测试信息',
                            description='工具处理过程中产生的测试信息，通常只有开启了debug模式的时候，才会有日志')
